﻿//下面的扩展是Jquery提交表单,toJSON,属性数组，val数组，format
(function ($) {
    var feature = {};
    feature.fileapi = $("<input type='file'/>").get(0).files !== undefined;
    feature.formdata = window.FormData !== undefined;
    $.fn.ajaxSubmit = function (options) {
        if (!this.length)
        {
            return this;
        }
        var method,
        action,
        url,
        $form = this;
        if (typeof options == 'function')
        {
            options = {
                success: options
            }
        }
        method = this.attr('method');
        action = this.attr('action');
        url = (typeof action === 'string') ? $.trim(action) : '';
        url = url || window.location.href || '';
        if (url)
        {
            url = (url.match(/^([^#]+)/) || [])[1]
        }
        options = $.extend(true, {
            url: url,
            success: $.ajaxSettings.success,
            type: method || 'GET',
            iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
        },
        options);
        var veto = {};
        this.trigger('form-pre-serialize', [this, options, veto]);
        if (veto.veto)
        {
            return this
        }
        if (options.beforeSerialize && options.beforeSerialize(this, options) === false)
        {
            return this
        }
        var traditional = options.traditional;
        if (traditional === undefined)
        {
            traditional = $.ajaxSettings.traditional
        }
        var elements = [];
        var qx,
        a = this.formToArray(options.semantic, elements);
        if (options.data)
        {
            options.extraData = options.data;
            qx = $.param(options.data, traditional)
        }
        if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false)
        {
            return this
        }
        this.trigger('form-submit-validate', [a, this, options, veto]);
        if (veto.veto)
        {
            return this
        }
        var q = $.param(a, traditional);
        if (qx)
        {
            q = (q ? (q + '&' + qx) : qx)
        }
        if (options.type.toUpperCase() == 'GET')
        {
            options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
            options.data = null
        } else
        {
            options.data = q
        }
        var callbacks = [];
        if (options.resetForm)
        {
            callbacks.push(function () {
                $form.resetForm()
            })
        }
        if (options.clearForm)
        {
            callbacks.push(function () {
                $form.clearForm(options.includeHidden)
            })
        }
        if (!options.dataType && options.target)
        {
            var oldSuccess = options.success ||
            function () { };
            callbacks.push(function (data) {
                var fn = options.replaceTarget ? 'replaceWith' : 'html';
                $(options.target)[fn](data).each(oldSuccess, arguments)
            })
        } else if (options.success)
        {
            callbacks.push(options.success)
        }
        options.success = function (data, status, xhr) {
            var context = options.context || this;
            for (var i = 0, max = callbacks.length; i < max; i++)
            {
                callbacks[i].apply(context, [data, status, xhr || $form, $form])
            }
        };
        var fileInputs = $('input[type=file]:enabled[value!=""]', this);
        var hasFileInputs = fileInputs.length > 0;
        var mp = 'multipart/form-data';
        var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
        var fileAPI = feature.fileapi && feature.formdata;
        var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
        var jqxhr;
        if (options.iframe !== false && (options.iframe || shouldUseFrame))
        {
            if (options.closeKeepAlive)
            {
                $.get(options.closeKeepAlive,
                function () {
                    jqxhr = fileUploadIframe(a)
                })
            } else
            {
                jqxhr = fileUploadIframe(a)
            }
        } else if ((hasFileInputs || multipart) && fileAPI)
        {
            jqxhr = fileUploadXhr(a)
        } else
        {
            jqxhr = $.ajax(options)
        }
        $form.removeData('jqxhr').data('jqxhr', jqxhr);
        for (var k = 0; k < elements.length; k++) elements[k] = null;
        this.trigger('form-submit-notify', [this, options]);
        return this;
        function deepSerialize(extraData) {
            var serialized = $.param(extraData).split('&');
            var len = serialized.length;
            var result = [];
            var i,
            part;
            for (i = 0; i < len; i++)
            {
                serialized[i] = serialized[i].replace(/\+/g, ' ');
                part = serialized[i].split('=');
                result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])])
            }
            return result
        }
        function fileUploadXhr(a) {
            var formdata = new FormData();
            for (var i = 0; i < a.length; i++)
            {
                formdata.append(a[i].name, a[i].value)
            }
            if (options.extraData)
            {
                var serializedData = deepSerialize(options.extraData);
                for (i = 0; i < serializedData.length; i++) if (serializedData[i]) formdata.append(serializedData[i][0], serializedData[i][1])
            }
            options.data = null;
            var s = $.extend(true, {},
            $.ajaxSettings, options, {
                contentType: false,
                processData: false,
                cache: false,
                type: method || 'POST'
            });
            if (options.uploadProgress)
            {
                s.xhr = function () {
                    var xhr = jQuery.ajaxSettings.xhr();
                    if (xhr.upload)
                    {
                        xhr.upload.addEventListener('progress',
                        function (event) {
                            var percent = 0;
                            var position = event.loaded || event.position;
                            var total = event.total;
                            if (event.lengthComputable)
                            {
                                percent = Math.ceil(position / total * 100)
                            }
                            options.uploadProgress(event, position, total, percent)
                        },
                        false)
                    }
                    return xhr
                }
            }
            s.data = null;
            var beforeSend = s.beforeSend;
            s.beforeSend = function (xhr, o) {
                o.data = formdata;
                if (beforeSend) beforeSend.call(this, xhr, o)
            };
            return $.ajax(s)
        }
        function fileUploadIframe(a) {
            var form = $form[0],
            el,
            i,
            s,
            g,
            id,
            $io,
            io,
            xhr,
            sub,
            n,
            timedOut,
            timeoutHandle;
            var useProp = !!$.fn.prop;
            var deferred = $.Deferred();
            if (a)
            {
                for (i = 0; i < elements.length; i++)
                {
                    el = $(elements[i]);
                    if (useProp) el.prop('disabled', false);
                    else el.removeAttr('disabled')
                }
            }
            s = $.extend(true, {},
            $.ajaxSettings, options);
            s.context = s.context || s;
            id = 'jqFormIO' + (new Date().getTime());
            if (s.iframeTarget)
            {
                $io = $(s.iframeTarget);
                n = $io.attr('name');
                if (!n) $io.attr('name', id);
                else id = n
            } else
            {
                $io = $('<iframe name="' + id + '" src="' + s.iframeSrc + '" />');
                $io.css({
                    position: 'absolute',
                    top: '-1000px',
                    left: '-1000px'
                })
            }
            io = $io[0];
            xhr = {
                aborted: 0,
                responseText: null,
                responseXML: null,
                status: 0,
                statusText: 'n/a',
                getAllResponseHeaders: function () { },
                getResponseHeader: function () { },
                setRequestHeader: function () { },
                abort: function (status) {
                    var e = (status === 'timeout' ? 'timeout' : 'aborted');
                    this.aborted = 1;
                    try
                    {
                        if (io.contentWindow.document.execCommand)
                        {
                            io.contentWindow.document.execCommand('Stop')
                        }
                    } catch (ignore) { }
                    $io.attr('src', s.iframeSrc);
                    xhr.error = e;
                    if (s.error) s.error.call(s.context, xhr, e, status);
                    if (g) $.event.trigger("ajaxError", [xhr, s, e]);
                    if (s.complete) s.complete.call(s.context, xhr, e)
                }
            };
            g = s.global;
            if (g && 0 === $.active++)
            {
                $.event.trigger("ajaxStart")
            }
            if (g)
            {
                $.event.trigger("ajaxSend", [xhr, s])
            }
            if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false)
            {
                if (s.global)
                {
                    $.active--
                }
                deferred.reject();
                return deferred
            }
            if (xhr.aborted)
            {
                deferred.reject();
                return deferred
            }
            sub = form.clk;
            if (sub)
            {
                n = sub.name;
                if (n && !sub.disabled)
                {
                    s.extraData = s.extraData || {};
                    s.extraData[n] = sub.value;
                    if (sub.type == "image")
                    {
                        s.extraData[n + '.x'] = form.clk_x;
                        s.extraData[n + '.y'] = form.clk_y
                    }
                }
            }
            var CLIENT_TIMEOUT_ABORT = 1;
            var SERVER_ABORT = 2;
            function getDoc(frame) {
                var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
                return doc
            }
            var csrf_token = $('meta[name=csrf-token]').attr('content');
            var csrf_param = $('meta[name=csrf-param]').attr('content');
            if (csrf_param && csrf_token)
            {
                s.extraData = s.extraData || {};
                s.extraData[csrf_param] = csrf_token
            }
            function doSubmit() {
                var t = $form.attr('target'),
                a = $form.attr('action');
                form.setAttribute('target', id);
                if (!method)
                {
                    form.setAttribute('method', 'POST')
                }
                if (a != s.url)
                {
                    form.setAttribute('action', s.url)
                }
                if (!s.skipEncodingOverride && (!method || /post/i.test(method)))
                {
                    $form.attr({
                        encoding: 'multipart/form-data',
                        enctype: 'multipart/form-data'
                    })
                }
                if (s.timeout)
                {
                    timeoutHandle = setTimeout(function () {
                        timedOut = true;
                        cb(CLIENT_TIMEOUT_ABORT)
                    },
                    s.timeout)
                }
                function checkState() {
                    try
                    {
                        var state = getDoc(io).readyState;
                        if (state && state.toLowerCase() == 'uninitialized') setTimeout(checkState, 50)
                    } catch (e)
                    {
                        cb(SERVER_ABORT);
                        if (timeoutHandle) clearTimeout(timeoutHandle);
                        timeoutHandle = undefined
                    }
                }
                var extraInputs = [];
                try
                {
                    if (s.extraData)
                    {
                        for (var n in s.extraData)
                        {
                            if (s.extraData.hasOwnProperty(n))
                            {
                                if ($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value'))
                                {
                                    extraInputs.push($('<input type="hidden" name="' + s.extraData[n].name + '">').val(s.extraData[n].value).appendTo(form)[0])
                                } else
                                {
                                    extraInputs.push($('<input type="hidden" name="' + n + '">').val(s.extraData[n]).appendTo(form)[0])
                                }
                            }
                        }
                    }
                    if (!s.iframeTarget)
                    {
                        $io.appendTo('body');
                        if (io.attachEvent) io.attachEvent('onload', cb);
                        else io.addEventListener('load', cb, false)
                    }
                    setTimeout(checkState, 15);
                    var submitFn = document.createElement('form').submit;
                    submitFn.apply(form)
                } finally
                {
                    form.setAttribute('action', a);
                    if (t)
                    {
                        form.setAttribute('target', t)
                    } else
                    {
                        $form.removeAttr('target')
                    }
                    $(extraInputs).remove()
                }
            }
            if (s.forceSync)
            {
                doSubmit()
            } else
            {
                setTimeout(doSubmit, 10)
            }
            var data,
            doc,
            domCheckCount = 50,
            callbackProcessed;
            function cb(e) {
                if (xhr.aborted || callbackProcessed)
                {
                    return
                }
                try
                {
                    doc = getDoc(io)
                } catch (ex)
                {
                    e = SERVER_ABORT
                }
                if (e === CLIENT_TIMEOUT_ABORT && xhr)
                {
                    xhr.abort('timeout');
                    deferred.reject(xhr, 'timeout');
                    return
                } else if (e == SERVER_ABORT && xhr)
                {
                    xhr.abort('server abort');
                    deferred.reject(xhr, 'error', 'server abort');
                    return
                }
                if (!doc || doc.location.href == s.iframeSrc)
                {
                    if (!timedOut) return
                }
                if (io.detachEvent) io.detachEvent('onload', cb);
                else io.removeEventListener('load', cb, false);
                var status = 'success',
                errMsg;
                try
                {
                    if (timedOut)
                    {
                        throw 'timeout'
                    }
                    var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
                    if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML))
                    {
                        if (--domCheckCount)
                        {
                            setTimeout(cb, 250);
                            return
                        }
                    }
                    var docRoot = doc.body ? doc.body : doc.documentElement;
                    xhr.responseText = docRoot ? docRoot.innerHTML : null;
                    xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
                    if (isXml) s.dataType = 'xml';
                    xhr.getResponseHeader = function (header) {
                        var headers = {
                            'content-type': s.dataType
                        };
                        return headers[header]
                    };
                    if (docRoot)
                    {
                        xhr.status = Number(docRoot.getAttribute('status')) || xhr.status;
                        xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText
                    }
                    var dt = (s.dataType || '').toLowerCase();
                    var scr = /(json|script|text)/.test(dt);
                    if (scr || s.textarea)
                    {
                        var ta = doc.getElementsByTagName('textarea')[0];
                        if (ta)
                        {
                            xhr.responseText = ta.value;
                            xhr.status = Number(ta.getAttribute('status')) || xhr.status;
                            xhr.statusText = ta.getAttribute('statusText') || xhr.statusText
                        } else if (scr)
                        {
                            var pre = doc.getElementsByTagName('pre')[0];
                            var b = doc.getElementsByTagName('body')[0];
                            if (pre)
                            {
                                xhr.responseText = pre.textContent ? pre.textContent : pre.innerText
                            } else if (b)
                            {
                                xhr.responseText = b.textContent ? b.textContent : b.innerText
                            }
                        }
                    } else if (dt == 'xml' && !xhr.responseXML && xhr.responseText)
                    {
                        xhr.responseXML = toXml(xhr.responseText)
                    }
                    try
                    {
                        data = httpData(xhr, dt, s)
                    } catch (e)
                    {
                        status = 'parsererror';
                        xhr.error = errMsg = (e || status)
                    }
                } catch (e)
                {
                    status = 'error';
                    xhr.error = errMsg = (e || status)
                }
                if (xhr.aborted)
                {
                    status = null
                }
                if (xhr.status)
                {
                    status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error'
                }
                if (status === 'success')
                {
                    if (s.success) s.success.call(s.context, data, 'success', xhr);
                    deferred.resolve(xhr.responseText, 'success', xhr);
                    if (g) $.event.trigger("ajaxSuccess", [xhr, s])
                } else if (status)
                {
                    if (errMsg === undefined) errMsg = xhr.statusText;
                    if (s.error) s.error.call(s.context, xhr, status, errMsg);
                    deferred.reject(xhr, 'error', errMsg);
                    if (g) $.event.trigger("ajaxError", [xhr, s, errMsg])
                }
                if (g) $.event.trigger("ajaxComplete", [xhr, s]);
                if (g && ! --$.active)
                {
                    $.event.trigger("ajaxStop")
                }
                if (s.complete) s.complete.call(s.context, xhr, status);
                callbackProcessed = true;
                if (s.timeout) clearTimeout(timeoutHandle);
                setTimeout(function () {
                    if (!s.iframeTarget) $io.remove();
                    xhr.responseXML = null
                },
                100)
            }
            var toXml = $.parseXML ||
            function (s, doc) {
                if (window.ActiveXObject)
                {
                    doc = new ActiveXObject('Microsoft.XMLDOM');
                    doc.async = 'false';
                    doc.loadXML(s)
                } else
                {
                    doc = (new DOMParser()).parseFromString(s, 'text/xml')
                }
                return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null
            };
            var parseJSON = $.parseJSON ||
            function (s) {
                return window['eval']('(' + s + ')')
            };
            var httpData = function (xhr, type, s) {
                var ct = xhr.getResponseHeader('content-type') || '',
                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
                data = xml ? xhr.responseXML : xhr.responseText;
                if (xml && data.documentElement.nodeName === 'parsererror')
                {
                    if ($.error) $.error('parsererror')
                }
                if (s && s.dataFilter)
                {
                    data = s.dataFilter(data, type)
                }
                if (typeof data === 'string')
                {
                    if (type === 'json' || !type && ct.indexOf('json') >= 0)
                    {
                        data = parseJSON(data)
                    } else if (type === "script" || !type && ct.indexOf("javascript") >= 0)
                    {
                        $.globalEval(data)
                    }
                }
                return data
            };
            return deferred
        }
    };
    $.fn.ajaxForm = function (options) {
        options = options || {};
        options.delegation = options.delegation && $.isFunction($.fn.on);
        if (!options.delegation && this.length === 0)
        {
            var o = {
                s: this.selector,
                c: this.context
            };
            if (!$.isReady && o.s)
            {
                $(function () {
                    $(o.s, o.c).ajaxForm(options)
                });
                return this
            }
            return this
        }
        if (options.delegation)
        {
            $(document).off('submit.form-plugin', this.selector, doAjaxSubmit).off('click.form-plugin', this.selector, captureSubmittingElement).on('submit.form-plugin', this.selector, options, doAjaxSubmit).on('click.form-plugin', this.selector, options, captureSubmittingElement);
            return this
        }
        return this.ajaxFormUnbind().bind('submit.form-plugin', options, doAjaxSubmit).bind('click.form-plugin', options, captureSubmittingElement)
    };
    function doAjaxSubmit(e) {
        var options = e.data;
        if (!e.isDefaultPrevented())
        {
            e.preventDefault();
            $(this).ajaxSubmit(options)
        }
    }
    function captureSubmittingElement(e) {
        var target = e.target;
        var $el = $(target);
        if (!($el.is("[type=submit],[type=image]")))
        {
            var t = $el.closest('[type=submit]');
            if (t.length === 0)
            {
                return
            }
            target = t[0]
        }
        var form = this;
        form.clk = target;
        if (target.type == 'image')
        {
            if (e.offsetX !== undefined)
            {
                form.clk_x = e.offsetX;
                form.clk_y = e.offsetY
            } else if (typeof $.fn.offset == 'function')
            {
                var offset = $el.offset();
                form.clk_x = e.pageX - offset.left;
                form.clk_y = e.pageY - offset.top
            } else
            {
                form.clk_x = e.pageX - target.offsetLeft;
                form.clk_y = e.pageY - target.offsetTop
            }
        }
        setTimeout(function () {
            form.clk = form.clk_x = form.clk_y = null
        },
        100)
    }
    $.fn.ajaxFormUnbind = function () {
        return this.unbind('submit.form-plugin click.form-plugin')
    };
    $.fn.formToArray = function (semantic, elements) {
        var a = [];
        if (this.length === 0)
        {
            return a
        }
        var form = this[0];
        var els = semantic ? form.getElementsByTagName('*') : form.elements;
        if (!els)
        {
            return a
        }
        var i,
        j,
        n,
        v,
        el,
        max,
        jmax;
        for (i = 0, max = els.length; i < max; i++)
        {
            el = els[i];
            n = el.name;
            if (!n)
            {
                continue
            }
            if (semantic && form.clk && el.type == "image")
            {
                if (!el.disabled && form.clk == el)
                {
                    a.push({
                        name: n,
                        value: $(el).val(),
                        type: el.type
                    });
                    a.push({
                        name: n + '.x',
                        value: form.clk_x
                    },
                    {
                        name: n + '.y',
                        value: form.clk_y
                    })
                }
                continue
            }
            v = $.fieldValue(el, true);
            if (v && v.constructor == Array)
            {
                if (elements) elements.push(el);
                for (j = 0, jmax = v.length; j < jmax; j++)
                {
                    a.push({
                        name: n,
                        value: v[j]
                    })
                }
            } else if (feature.fileapi && el.type == 'file' && !el.disabled)
            {
                if (elements) elements.push(el);
                var files = el.files;
                if (files.length)
                {
                    for (j = 0; j < files.length; j++)
                    {
                        a.push({
                            name: n,
                            value: files[j],
                            type: el.type
                        })
                    }
                } else
                {
                    a.push({
                        name: n,
                        value: '',
                        type: el.type
                    })
                }
            } else if (v !== null && typeof v != 'undefined')
            {
                if (elements) elements.push(el);
                a.push({
                    name: n,
                    value: v,
                    type: el.type,
                    required: el.required
                })
            }
        }
        if (!semantic && form.clk)
        {
            var $input = $(form.clk),
            input = $input[0];
            n = input.name;
            if (n && !input.disabled && input.type == 'image')
            {
                a.push({
                    name: n,
                    value: $input.val()
                });
                a.push({
                    name: n + '.x',
                    value: form.clk_x
                },
                {
                    name: n + '.y',
                    value: form.clk_y
                })
            }
        }
        return a
    };
    $.fn.formSerialize = function (semantic) {
        return $.param(this.formToArray(semantic))
    };
    $.fn.fieldSerialize = function (successful) {
        var a = [];
        this.each(function () {
            var n = this.name;
            if (!n)
            {
                return
            }
            var v = $.fieldValue(this, successful);
            if (v && v.constructor == Array)
            {
                for (var i = 0, max = v.length; i < max; i++)
                {
                    a.push({
                        name: n,
                        value: v[i]
                    })
                }
            } else if (v !== null && typeof v != 'undefined')
            {
                a.push({
                    name: this.name,
                    value: v
                })
            }
        });
        return $.param(a)
    };
    $.fn.fieldValue = function (successful) {
        for (var val = [], i = 0, max = this.length; i < max; i++)
        {
            var el = this[i];
            var v = $.fieldValue(el, successful);
            if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
            {
                continue
            }
            if (v.constructor == Array) $.merge(val, v);
            else val.push(v)
        }
        return val
    };
    $.fieldValue = function (el, successful) {
        var n = el.name,
        t = el.type,
        tag = el.tagName.toLowerCase();
        if (successful === undefined)
        {
            successful = true
        }
        if (successful && (!n || el.disabled || t == 'reset' || t == 'button' || (t == 'checkbox' || t == 'radio') && !el.checked || (t == 'submit' || t == 'image') && el.form && el.form.clk != el || tag == 'select' && el.selectedIndex == -1))
        {
            return null
        }
        if (tag == 'select')
        {
            var index = el.selectedIndex;
            if (index < 0)
            {
                return null
            }
            var a = [],
            ops = el.options;
            var one = (t == 'select-one');
            var max = (one ? index + 1 : ops.length);
            for (var i = (one ? index : 0) ; i < max; i++)
            {
                var op = ops[i];
                if (op.selected)
                {
                    var v = op.value;
                    if (!v)
                    {
                        v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value
                    }
                    if (one)
                    {
                        return v
                    }
                    a.push(v)
                }
            }
            return a
        }
        return $(el).val()
    };
    $.fn.clearForm = function (includeHidden) {
        return this.each(function () {
            $('input,select,textarea', this).clearFields(includeHidden)
        })
    };
    $.fn.clearFields = $.fn.clearInputs = function (includeHidden) {
        var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;
        return this.each(function () {
            var t = this.type,
            tag = this.tagName.toLowerCase();
            if (re.test(t) || tag == 'textarea')
            {
                this.value = ''
            } else if (t == 'checkbox' || t == 'radio')
            {
                this.checked = false
            } else if (tag == 'select')
            {
                this.selectedIndex = -1
            } else if (t == "file")
            {
                if (/MSIE/.test(navigator.userAgent))
                {
                    $(this).replaceWith($(this).clone())
                } else
                {
                    $(this).val('')
                }
            } else if (includeHidden)
            {
                if ((includeHidden === true && /hidden/.test(t)) || (typeof includeHidden == 'string' && $(this).is(includeHidden))) this.value = ''
            }
        })
    };
    $.fn.resetForm = function () {
        return this.each(function () {
            if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
            {
                this.reset()
            }
        })
    };
    $.fn.enable = function (b) {
        if (b === undefined)
        {
            b = true
        }
        return this.each(function () {
            this.disabled = !b
        })
    };
    $.fn.selected = function (select) {
        if (select === undefined)
        {
            select = true
        }
        return this.each(function () {
            var t = this.type;
            if (t == 'checkbox' || t == 'radio')
            {
                this.checked = select
            } else if (this.tagName.toLowerCase() == 'option')
            {
                var $sel = $(this).parent('select');
                if (select && $sel[0] && $sel[0].type == 'select-one')
                {
                    $sel.find('option').selected(false)
                }
                this.selected = select
            }
        })
    };
    $.fn.toJSON = function (o) {
        //#region
        var useHasOwn = !!{}.hasOwnProperty,
        isNative = false,
        pad = function (n) { return n < 10 ? "0" + n : n },
        toString = Object.prototype.toString,
        isDefined = function (v) { return typeof v !== 'undefined' },
        isArray = function (v) { return toString.apply(v) === '[object Array]' },
        isDate = function (v) { return toString.apply(v) === '[object Date]' },
        isString = function (v) { return typeof v === 'string' },
        isBoolean = function (v) { return typeof v === 'boolean' },
        m = { "\b": '\\b', "\t": '\\t', "\n": '\\n', "\f": '\\f', "\r": '\\r', '"': '\\"', "\\": '\\\\' },
        encodeString = function (s) { if (/["\\\x00-\x1f]/.test(s)) { return '"' + s.replace(/([\x00-\x1f\\"])/g, function (a, b) { var c = m[b]; if (c) { return c } c = b.charCodeAt(); return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16) }) + '"' } return '"' + s + '"' },
        encodeArray = function (o) { var a = ["["], b, i, l = o.length, v; for (i = 0; i < l; i += 1) { v = o[i]; switch (typeof v) { case "undefined": case "function": case "unknown": break; default: if (b) { a.push(',') } a.push(v === null ? "null" : jQuery.toJSON(v)); b = true } } a.push("]"); return a.join("") };
        encodeDate = function (o) { return '"' + o.getFullYear() + "-" + pad(o.getMonth() + 1) + "-" + pad(o.getDate()) + "T" + pad(o.getHours()) + ":" + pad(o.getMinutes()) + ":" + pad(o.getSeconds()) + '"' };
        doEncode = function (o) {
            if (!isDefined(o) || o === null) { return "null" }
            else if (isArray(o)) { return encodeArray(o) }
            else if (isDate(o)) { return encodeDate(o) }
            else if (isString(o)) { return encodeString(o) }
            else if (typeof o == "number") { return isFinite(o) ? String(o) : "null" }
            else if (isBoolean(o)) { return String(o) }
            else
            {
                var a = ["{"], b, i, v;
                if (!o.getElementsByTagName)
                {
                    for (i in o)
                    {
                        if (!useHasOwn || o.hasOwnProperty(i))
                        {
                            v = o[i];
                            switch (typeof v)
                            {
                                case "undefined":
                                case "function":
                                case "unknown":
                                    break;
                                default:
                                    if (b)
                                    {
                                        a.push(',')
                                    }
                                    a.push(doEncode(i), ":", v === null ? "null" : doEncode(v));
                                    b = true
                            }
                        }
                    }
                }
                a.push("}");
                return a.join("")
            }
        }
        return doEncode(o);
        //#endregion
    };
    $.fn.attrs = function (name) {
        var result = new Array();
        $(this).each(function () { result.push($(this).attr(name)); });
        return result;
    };
    $.fn.vals = function () {
        var result = new Array();
        $(this).each(function () { result.push($(this).val()); });
        return result;
    };
    $.fn.format = function (formater, arg) {
        //#region
        var result = formater || "", args = arguments;
        if (arguments.length > 1)
        {
            if (/\{(\d+)\}/g.test(formater))
            {
                result = result.replace(/\{(\d+)\}/g, function (m, i) {
                    return args[parseInt(i) + 1] || m;
                });
            }
            else if (args.length == 2 && typeof args[1] == "object")
            {
                result = result.replace(/\{(\w+)\}/g, function (m, i) {
                    return args[1][i] || m;
                });
            }
        }
        return result;
        //#endregion
    };
    $.fn.indexes = function (filter) {
        var result = new Array();
        $(this).each(function (idx) { if ($(this).is(filter)) { result.push(idx); } });
        return result;
    };
})(jQuery);

//下面对Number进行扩展
Number.implement({
    comma: function (len) {
        var source = this;
        if (!length || length < 1)
        {
            length = 3;
        }

        source = String(source).split(".");
        source[0] = source[0].replace(new RegExp('(\\d)(?=(\\d{' + length + '})+$)', 'ig'), "$1,");
        return source.join(".");
    },
    pad: function (length, sign) {
        var source = this;
        var pre = "",
            negative = (source < 0),
            string = String(Math.abs(source));

        if (string.length < length)
        {
            pre = (new Array(length - string.length + 1)).join('0');
        }

        return (negative ? "-" : (sign ? "+" : "")) + pre + string;
    },
    random: function (min, max) {
        return Math.floor(Math.random() * (max - min + 1) + min);
    }
});
Array.implement({
    contains: function (item) {
        return !!~this.indexOf(item);
    },
    find: function (iterator) {
        var i, item, n = this.length;

        if (typeof (iterator) == "function")
        {
            for (i = 0; i < n; i++)
            {
                item = this[i];
                if (iterator.call(this, item, i, this) === true)
                {
                    return item;
                }
            }
        }
        return null;
    },
    remove: function (match) {
        var n = this.length;
        while (n--)
        {
            if (this[n] === match)
            {
                this.splice(n, 1);
            }
        }
        return this;
    },
    removeAt: function (index) {
        return this.splice(index, 1)[0];
    }
});
Date.implement({
    parse: function (source) {
        var reg = new RegExp("^\\d+(\\-|\\/)\\d+(\\-|\\/)\\d+\x24");
        if ('string' == typeof source)
        {
            if (reg.test(source) || isNaN(Date.parse(source)))
            {
                var d = source.split(/ |T/),
                    d1 = d.length > 1
                            ? d[1].split(/[^\d]/)
                            : [0, 0, 0],
                    d0 = d[0].split(/[^\d]/);
                return new Date(d0[0] - 0,
                                d0[1] - 1,
                                d0[2] - 0,
                                d1[0] - 0,
                                d1[1] - 0,
                                d1[2] - 0);
            } else
            {
                return new Date(source);
            }
        }
        return new Date();
    },
    toString: function (pattern) {
        if (!pattern)
        {
            pattern = "yyyy-MM-dd";
        }
        if ('string' != typeof pattern)
        {
            return this.toString();
        }

        function replacer(patternPart, result) {
            pattern = pattern.replace(patternPart, result);
        }

        var pad = Number.pad,
            year = this.getFullYear(),
            month = this.getMonth() + 1,
            date2 = this.getDate(),
            hours = this.getHours(),
            minutes = this.getMinutes(),
            seconds = this.getSeconds();

        replacer(/yyyy/g, pad(year, 4));
        replacer(/yy/g, pad(parseInt(year.toString().slice(2), 10), 2));
        replacer(/MM/g, pad(month, 2));
        replacer(/M/g, month);
        replacer(/dd/g, pad(date2, 2));
        replacer(/d/g, date2);

        replacer(/HH/g, pad(hours, 2));
        replacer(/H/g, hours);
        replacer(/hh/g, pad(hours % 12, 2));
        replacer(/h/g, hours % 12);
        replacer(/mm/g, pad(minutes, 2));
        replacer(/m/g, minutes);
        replacer(/ss/g, pad(seconds, 2));
        replacer(/s/g, seconds);

        return pattern;
    }

});

function PTA() {
    var uid = 0,zidx = 0;
    this.UID = function () { return "pta_ctl_uid_" + (++uid); };
    this.ZIDX = function () { return ++zidx; };
};